#include <algorithm>
#include <cctype> //ctype无法打开，包含tolower()函数和ispunct函数
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility> //保存pair的头文件
#include <vector>

using namespace std;

class A {
public:
  //默认构造函数
  A(int m) : val(m) { cout << "默认构造函数" << endl; }
  //拷贝赋值运算符
  A &operator=(const A &a) {
    val = a.val;
    cout << "拷贝复制运算符" << endl;
    return *this;
  }
  //析构函数
  ~A() { cout << "析构函数" << endl; }
  int val;
};

void show1(A &a) { cout << a.val << endl; }
void show2(A a) { cout << a.val << endl; }
int main(int argc, char **argv) {
  //将A的对象当作引用或者非引用传递
  A a(10);
  A b(5);
  A c(2);
  c = a;
  show1(a);
  show2(b);
  show2(c);
  //存放于容器中
  vector<A> m;
  m.push_back(a);
  //动态分配
  A *d = new A(5);
  show2(*d);
  delete d;
  return 0;
}
// 默认构造函数A a(10);
// 默认构造函数 A b(5);
// 默认构造函数A c(2);
// 拷贝复制运算符 c = a;
// 10  show1(a);
// 5  show2(b);
// 析构函数 show2(b);执行结束 销毁a
// 10   show2(c);
// 析构函数 show2(c);执行结束销毁a
// 默认构造函数   A *d = new A(5);
// 5 show2(*d);
// 析构函数 show2(*d);执行结束销毁a
// 析构函数 delete d;销毁a所指对象
// 析构函数 a销毁
// 析构函数 b销毁
// 析构函数 c销毁
// 析构函数 m销毁(销毁m中的元素)